const jwt = require('jsonwebtoken');
const User = require('../models/User');
const { errorResponse } = require('../utils/responses');

/**
 * 保护路由中间件 - 验证用户令牌并添加用户信息到请求
 */
const protect = async (req, res, next) => {
  let token;
  
  // 从请求头中获取令牌
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) {
    token = req.headers.authorization.split(' ')[1];
  } else if (req.headers['x-auth-token']) {
    token = req.headers['x-auth-token'];
  }

  // 检查是否存在令牌
  if (!token) {
    return errorResponse(res, 401, '无访问权限，请先登录', ['未提供认证令牌']);
  }

  try {
    // 验证令牌
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    
    // 正确获取用户ID，支持多种令牌格式
    // 有可能是 decoded.id 或 decoded.user.id
    const userId = decoded.user?.id || decoded.id;

    console.log('Token解析结果:', decoded);
    console.log('尝试查找用户ID:', userId);
    
    // 查找用户并添加到请求
    const user = await User.findById(userId).select('-password');
    
    if (!user) {
      console.error(`未找到用户，ID: ${userId}`);
      return errorResponse(res, 401, '用户不存在或已被删除');
    }
    
    console.log(`找到用户: ${user._id}, 用户名: ${user.username || user.nickname}`);
    
    // 检查用户是否被禁用
    if (!user.isActive) {
      return errorResponse(res, 403, '账户已被禁用，请联系管理员');
    }
    
    // 将用户信息添加到请求对象
    req.user = user;
    next();
  } catch (err) {
    console.error('令牌验证失败:', err);
    return errorResponse(res, 401, '无效的令牌，请重新登录');
  }
};

/**
 * 管理员权限中间件 - 检查用户是否为管理员
 */
const admin = (req, res, next) => {
  if (req.user && req.user.role === 'admin') {
    next();
  } else {
    return errorResponse(res, 403, '无权访问，需要管理员权限');
  }
};

module.exports = { protect, admin }; 